import type {TreeDataItem, CheckEvent as CheckEventOrigin} from 'ant-design-vue/es/tree/Tree';
import {ContextMenuItem} from '/@/hooks/web/useContextMenu';

export interface ActionItem {
    render: (record: Recordable) => any;
    show?: boolean | ((record: Recordable) => boolean);
}

export interface TreeItem extends TreeDataItem {
    icon?: any;
}

export interface ReplaceFields {
    children?: string;
    title?: string;
    key?: string;
}

export type Keys = (string | number)[];
export type CheckKeys =
    | (string | number)[]
    | { checked: (string | number)[]; halfChecked: (string | number)[] };

export interface TreeActionType {
    checkAll: (checkAll: boolean) => void;
    expandAll: (expandAll: boolean) => void;
    setExpandedKeys: (keys: Keys) => void;
    getExpandedKeys: () => Keys;
    setSelectedKeys: (keys: Keys) => void;
    getSelectedKeys: () => Keys;
    setCheckedKeys: (keys: CheckKeys) => void;
    getCheckedKeys: () => CheckKeys;
    filterByLevel: (level: number) => void;
    insertNodeByKey: (opt: InsertNodeParams) => void;
    insertNodesByKey: (opt: InsertNodeParams) => void;
    deleteNodeByKey: (key: string) => void;
    updateNodeByKey: (key: string, node: Omit<TreeDataItem, 'key'>) => void;
    setSearchValue: (value: string) => void;
    getSearchValue: () => string;
}

export interface InsertNodeParams {
    parentKey: string | null;
    node: TreeDataItem;
    list?: TreeDataItem[];
    push?: 'push' | 'unshift';
}

export interface ContextMenuOptions {
    icon?: string;
    styles?: any;
    items?: ContextMenuItem[];
}

export type CheckEvent = CheckEventOrigin;
